/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.facturacion.web;

import isd.facturacion.modelo.FC_Circuito;
import isd.facturacion.modelo.FC_ItemProducto;
import isd.facturacion.modelo.FC_Movimiento;
import isd.facturacion.rn.FC_CircuitoRN;
import isd.facturacion.rn.FC_MovimientoRN;
import isd.facturacion.vista.FC_ItemPendiente;
import isd.facturacion.vista.FC_MovimientoPendiente;
import isd.general.excepciones.ExcepcionGeneralSistema;
import isd.general.web.GenericBean;
import isd.inventario.modelo.ST_Producto;
import isd.inventario.web.BuscadorProductoBean;
import isd.general.util.JsfUtil;
import isd.seguridad.web.UsuarioSession;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedProperty;

/**
 *
 * @author ctrosch
 */
public class FC_Registraciones extends GenericBean implements Serializable {

    protected @EJB FC_MovimientoRN facturacionRN;
    protected @EJB FC_CircuitoRN circuitoRN;

    //Datos inicializacion registracion
    protected String CIRCOM = "";
    protected String CIRAPL = "";
    protected String MODCOM = "";
    protected String CODCOM = "";

    //Datos para generar movimientos aplicados
    protected List<FC_MovimientoPendiente> movimientosPendientes;
    protected List<FC_ItemPendiente> itemsPendiente;
    protected FC_MovimientoPendiente movimientoPendiente;
    protected boolean seleccionarTodo;
    protected Map<String,String> filtroGrupo;
    protected Map<String,String> filtroDetalle;


    @ManagedProperty(value = "#{usuarioSession}")
    protected UsuarioSession usuarioSession;

    @ManagedProperty(value = "#{buscadorProductoBean}")
    protected BuscadorProductoBean buscadorProductoBean;

    protected FC_Movimiento m;
    protected FC_Circuito circuito;



    /** Creates a new instance of FC_Movimiento */
    public FC_Registraciones() {

        movimientoPendiente = new FC_MovimientoPendiente();
        itemsPendiente = new ArrayList<FC_ItemPendiente>();
        filtroGrupo = new HashMap<String,String>();
        filtroDetalle = new HashMap<String,String>();

    }

    public void nuevoMovimiento(){

        try {
            if(circuito==null){
                JsfUtil.addErrorMessage("El circuito no puede ser nulo");
            }

            if (CIRCOM.equals(CIRAPL)) {
                m = facturacionRN.nuevoMovimiento(circuito);
            } else {
                m = null;
            }
        } catch (ExcepcionGeneralSistema e) {
            JsfUtil.addErrorMessage(e.getMessage());
        }
    }

    public void guardar(boolean  nuevo){

        try {
            // Primero sacamos de la lista el item vacio si es circuito de inicio
            if(!m.getItemsProducto().isEmpty()){
                if(CIRCOM.equals(CIRAPL)){
                    int indice = m.getItemsProducto().size()-1;
                    m.getItemsProducto().remove(indice);
                }
            }

            facturacionRN.guardar(m);
            JsfUtil.addInfoMessage("El documento "+m.getComprobante().getDescrp()+"-"+m.getNrofor()+" se guardó correctamente","");

            if(nuevo){
                nuevoMovimiento();
            }

        } catch (Exception ex) {

            if(circuito.getAgregaItems().equals("S")){
                //Cargarmos un nuevo item en blanco en caso de que quieran guardar sin agregar un items
                m.getItemsProducto().add((FC_ItemProducto) facturacionRN.nuevoItemProducto(m));
            }
            JsfUtil.addErrorMessage(ex.getMessage());
//            ex.printStackTrace();
        }
    }

    public void agregarItem(FC_ItemProducto nItem){
        try {

            if(!puedoAgregarItem(nItem)) return;

            BigDecimal cantidad = nItem.getCantid();
            ST_Producto prd = buscadorProductoBean.getProducto();

            nItem.setProducto(prd);
            nItem.setProductoOriginal(prd);
            nItem.setUnidadMedida(prd.getUnidadMedida());

            nItem.setCantid(cantidad);
            nItem.setCantst(cantidad);
            nItem.setCntori(cantidad);
            
            //Cargarmos un nuevo item en blanco
            m.getItemsProducto().add((FC_ItemProducto) facturacionRN.nuevoItemProducto(m));
            buscadorProductoBean.setProducto(new ST_Producto());

        } catch (Exception ex) {
            ex.printStackTrace();
            JsfUtil.addErrorMessage(ex.getMessage());
        }
    }

    public void eliminarItem(FC_ItemProducto nItem){

        if(facturacionRN.eliminarItemProducto(m, nItem)){
            JsfUtil.addWarningMessage("Se ha borrado el item "+ nItem.getProducto().getDescrp() + "");
        }else{
            JsfUtil.addWarningMessage("No se ha borrado el item "+ nItem.getProducto().getDescrp() + "");
        }
    }

    public boolean puedoAgregarItem(FC_ItemProducto nItem){

        if(nItem==null){
            JsfUtil.addErrorMessage("No se ha creado el item");
            return false;
        }

        if((circuito.getItmuni()=='S') && (m.getItemsProducto().size() > 1)){
            JsfUtil.addErrorMessage("Ha superado la cantidad máxima de items, no puede continuar agregando");
            return false;
        }

        if(nItem.getCantid()==null || nItem.getCantid().compareTo(BigDecimal.ZERO)<=0){
            JsfUtil.addErrorMessage("Ingrese un valor de cantidad válido. Mayor a 0");
            return false;
        }

        if(buscadorProductoBean.getProducto()==null){
            JsfUtil.addErrorMessage("Seleccione un producto para agregar al comprobante");
            return false;
        }

        return true;
    }

    public void seleccionar(FC_Movimiento m){
        this.m = m;
    }

    public void actualizarCantidades(FC_ItemProducto item){

        item.setCantst(item.getCantid());

        if (CIRCOM.equals(CIRAPL)) {
            item.setCntori(item.getCantid());
        }
        
        actualizarAtributos(item);

    }

    /**
    * Actualizamos los atributos de stock, por el momento solo maneja nro de serie
    * @param item
    */
    public void actualizarAtributos(FC_ItemProducto item){

        //item.getItemDetalle().clear();
        //FC_ItemDetalle nuevoItemDetalle = facturacionRN.nuevoItemDetalle(item);
    }

    public void imprimir(){

        try {
//            System.out.println("Nombre reporte " + m.getFormulario().getNombreReporte());
//
//            if (m.getFormulario().getNombreReporte()==null){
//                throw new ExcepcionGeneralSistema("El comprobante no tienen reporte asociado");
//            }
//
//            //JasperReport masterReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream("/isd/produccion/reporte/"+ m.getFormulario().getNombreReporte()+".jasper"));
//            JasperReport masterReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream( m.getFormulario().getNombreReporte()+".jasper"));
//
//            Map parameters = new HashMap();
//            parameters.put("MODFOR", m.getModfor());
//            parameters.put("CODFOR", m.getCodfor());
//            parameters.put("NROFOR", m.getNrofor());
//
//            empresaRN.cargarDatosEmpresa(parameters);
//
//            String nombreArchivo = m.getComprobante().getCodigo()+"-"+m.getNrofor();
//
//            ReportFactory reportFactory = new ReportFactory();
//            reportFactory.verReportePDF(masterReport, nombreArchivo, parameters);

        } catch (NullPointerException npe) {
            JsfUtil.addErrorMessage("No se encontró el archivo: " + m.getFormulario().getNombreReporte()+".jasper");
        } catch (Exception e){
            e.printStackTrace();
            JsfUtil.addErrorMessage("No se puede imprimir a pdf " + e.getMessage());
        }
    }

    public String getCIRAPL() {
        return CIRAPL;
    }

    public void setCIRAPL(String CIRAPL) {
        this.CIRAPL = CIRAPL;
    }

    public String getCIRCOM() {
        return CIRCOM;
    }

    public void setCIRCOM(String CIRCOM) {
        this.CIRCOM = CIRCOM;
    }

    public String getCODCOM() {
        return CODCOM;
    }

    public void setCODCOM(String CODCOM) {
        this.CODCOM = CODCOM;
    }

    public String getMODCOM() {
        return MODCOM;
    }

    public void setMODCOM(String MODCOM) {
        this.MODCOM = MODCOM;
    }

    public BuscadorProductoBean getBuscadorProductoBean() {
        return buscadorProductoBean;
    }

    public void setBuscadorProductoBean(BuscadorProductoBean buscadorProductoBean) {
        this.buscadorProductoBean = buscadorProductoBean;
    }

    public FC_Circuito getCircuito() {
        return circuito;
    }

    public void setCircuito(FC_Circuito circuito) {
        this.circuito = circuito;
    }

    public Map<String, String> getFiltroDetalle() {
        return filtroDetalle;
    }

    public void setFiltroDetalle(Map<String, String> filtroDetalle) {
        this.filtroDetalle = filtroDetalle;
    }

    public Map<String, String> getFiltroGrupo() {
        return filtroGrupo;
    }

    public void setFiltroGrupo(Map<String, String> filtroGrupo) {
        this.filtroGrupo = filtroGrupo;
    }

    public List<FC_ItemPendiente> getItemsPendiente() {
        return itemsPendiente;
    }

    public void setItemsPendiente(List<FC_ItemPendiente> itemsPendiente) {
        this.itemsPendiente = itemsPendiente;
    }

    public FC_Movimiento getM() {
        return m;
    }

    public void setM(FC_Movimiento m) {
        this.m = m;
    }

    public FC_MovimientoPendiente getMovimientoPendiente() {
        return movimientoPendiente;
    }

    public void setMovimientoPendiente(FC_MovimientoPendiente movimientoPendiente) {
        this.movimientoPendiente = movimientoPendiente;
    }

    public List<FC_MovimientoPendiente> getMovimientosPendientes() {
        return movimientosPendientes;
    }

    public void setMovimientosPendientes(List<FC_MovimientoPendiente> movimientosPendientes) {
        this.movimientosPendientes = movimientosPendientes;
    }

    public boolean isSeleccionarTodo() {
        return seleccionarTodo;
    }

    public void setSeleccionarTodo(boolean seleccionarTodo) {
        this.seleccionarTodo = seleccionarTodo;
    }

    public UsuarioSession getUsuarioSession() {
        return usuarioSession;
    }

    public void setUsuarioSession(UsuarioSession usuarioSession) {
        this.usuarioSession = usuarioSession;
    }


   
}
